有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Restcontroller将空值转换为空字符串

我在Spring中使用@RestController,我有以下响应:

{"name":"Khan","first":null,"last":null}

我希望null为""(空字符串)

我不想做一些丑陋的事情,比如用空字符串初始化每个属性,如下所示:

@Transient private String first="";
@Transient private String last="";

我找到了一个讨论how to implement this solution "for Jackson < 2.0)"的链接,但我正在使用Jackson库>;2.0类似于:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>

此外,根据其他一些人的说法,链接中的解决方案并不总是有效

是否有一种优雅的方式将具有空值的字段转换为空字符串?最好有注释


共 (3) 个答案

  1. # 1 楼答案

    我认为@Raphael Amoedo走在了正确的轨道上,但我认为您问题的本质意味着解决方案将是使用getFirst()getLast()方法

    public string getFirst(){
       if (this.first == null) return "";
       return this.first;
    }
    
    public string getLast(){
       if (this.last == null) return "";
       return this.last;
    }
    

    这确保了如果firstlast字段通过任何其他方式(可能是序列化)设置为null,则它们仍将返回空字符串而不是null值

  2. # 2 楼答案

    我之前的回答是不可接受的,因为它不包括注释和序列化程序。因此,关于this链接(我通过搜索“jackson 2.0自定义序列化程序”在google上找到了该链接),我认为这应该是可行的(假设您的类是Person,因为它没有指定):

    public class PersonSerializer extends JsonSerializer<Person> {
    @Override
    public void serialize(Person value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeStringField("name", value.name);
            if (value.first == null) {
                jgen.writeStringField("first", ""); 
            }else{
                jgen.writeStringField("first", value.first);
            }
            if(value.last == null){
                jgen.writeStringField("last", "");
            }else{
                jgen.writeStringField("last", value.last);
            }
            jgen.writeEndObject();
        }
    }
    

    然后在你的个人课上

    @JsonSerialize(using = PersonSerializer.class)
    public class Person {
        //First/Last name etc
    }
    

    我认为您应该重新评估为什么需要为此定制解析器,如果您继续阅读此答案顶部的整个链接,您将看到定制解析器的用例以及它与您的不同之处。在他的例子中,他希望返回一些与该字段没有直接关系的数据,而您只希望将null视为空字符串

  3. # 3 楼答案

    您可以覆盖setFirst和setLast

     public void setFirst(String first) { 
            if(first == null) { 
               this.first = ""; 
            } else {
               this.first = first;
            }
     }